{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Otto商品预测——SVM系列\n",
    "\n",
    "  \n",
    "## 1、数据处理\n",
    "\n",
    "### （1）导入相关包和数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "from matplotlib import pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>feat_1</th>\n",
       "      <th>feat_2</th>\n",
       "      <th>feat_3</th>\n",
       "      <th>feat_4</th>\n",
       "      <th>feat_5</th>\n",
       "      <th>feat_6</th>\n",
       "      <th>feat_7</th>\n",
       "      <th>feat_8</th>\n",
       "      <th>feat_9</th>\n",
       "      <th>...</th>\n",
       "      <th>feat_84_tfidf</th>\n",
       "      <th>feat_85_tfidf</th>\n",
       "      <th>feat_86_tfidf</th>\n",
       "      <th>feat_87_tfidf</th>\n",
       "      <th>feat_88_tfidf</th>\n",
       "      <th>feat_89_tfidf</th>\n",
       "      <th>feat_90_tfidf</th>\n",
       "      <th>feat_91_tfidf</th>\n",
       "      <th>feat_92_tfidf</th>\n",
       "      <th>feat_93_tfidf</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0.016393</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.075886</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.013158</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.013158</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>0.016393</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.014286</td>\n",
       "      <td>0.315789</td>\n",
       "      <td>0.1</td>\n",
       "      <td>0.131579</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.460983</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.008244</td>\n",
       "      <td>0.022456</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.124622</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.145988</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 188 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   id    feat_1  feat_2  feat_3    feat_4    feat_5  feat_6    feat_7  \\\n",
       "0   1  0.016393     0.0     0.0  0.000000  0.000000     0.0  0.000000   \n",
       "1   2  0.000000     0.0     0.0  0.000000  0.000000     0.0  0.000000   \n",
       "2   3  0.000000     0.0     0.0  0.000000  0.000000     0.0  0.000000   \n",
       "3   4  0.016393     0.0     0.0  0.014286  0.315789     0.1  0.131579   \n",
       "4   5  0.000000     0.0     0.0  0.000000  0.000000     0.0  0.000000   \n",
       "\n",
       "     feat_8  feat_9  ...  feat_84_tfidf  feat_85_tfidf  feat_86_tfidf  \\\n",
       "0  0.000000     0.0  ...       0.000000       0.075886       0.000000   \n",
       "1  0.013158     0.0  ...       0.000000       0.000000       0.000000   \n",
       "2  0.013158     0.0  ...       0.000000       0.000000       0.000000   \n",
       "3  0.000000     0.0  ...       0.460983       0.000000       0.008244   \n",
       "4  0.000000     0.0  ...       0.000000       0.124622       0.000000   \n",
       "\n",
       "   feat_87_tfidf  feat_88_tfidf  feat_89_tfidf  feat_90_tfidf  feat_91_tfidf  \\\n",
       "0       0.000000            0.0            0.0       0.000000            0.0   \n",
       "1       0.000000            0.0            0.0       0.000000            0.0   \n",
       "2       0.000000            0.0            0.0       0.000000            0.0   \n",
       "3       0.022456            0.0            0.0       0.000000            0.0   \n",
       "4       0.000000            0.0            0.0       0.145988            0.0   \n",
       "\n",
       "   feat_92_tfidf  feat_93_tfidf  \n",
       "0            0.0            0.0  \n",
       "1            0.0            0.0  \n",
       "2            0.0            0.0  \n",
       "3            0.0            0.0  \n",
       "4            0.0            0.0  \n",
       "\n",
       "[5 rows x 188 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dpath = './Otto_data/'\n",
    "\n",
    "# 采用原始特征 + tf_idf特征\n",
    "train1 = pd.read_csv(dpath +\"Otto_FE_train_org.csv\")\n",
    "train2 = pd.read_csv(dpath +\"Otto_FE_train_tfidf.csv\")\n",
    "\n",
    "# 去掉多余的id\n",
    "train2 = train2.drop([\"id\",\"target\"], axis=1)\n",
    "train =  pd.concat([train1, train2], axis = 1, ignore_index=False)\n",
    "\n",
    "del train1\n",
    "del train2\n",
    "\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(61878, 188)\n"
     ]
    }
   ],
   "source": [
    "print (train.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### （2）分割数据\n",
    "\n",
    "    采用train_test_split，从数据集中随机抽取10000条记录，用来训练模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_split.py:2179: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feat_1</th>\n",
       "      <th>feat_2</th>\n",
       "      <th>feat_3</th>\n",
       "      <th>feat_4</th>\n",
       "      <th>feat_5</th>\n",
       "      <th>feat_6</th>\n",
       "      <th>feat_7</th>\n",
       "      <th>feat_8</th>\n",
       "      <th>feat_9</th>\n",
       "      <th>feat_10</th>\n",
       "      <th>...</th>\n",
       "      <th>feat_84_tfidf</th>\n",
       "      <th>feat_85_tfidf</th>\n",
       "      <th>feat_86_tfidf</th>\n",
       "      <th>feat_87_tfidf</th>\n",
       "      <th>feat_88_tfidf</th>\n",
       "      <th>feat_89_tfidf</th>\n",
       "      <th>feat_90_tfidf</th>\n",
       "      <th>feat_91_tfidf</th>\n",
       "      <th>feat_92_tfidf</th>\n",
       "      <th>feat_93_tfidf</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>39091</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.015625</td>\n",
       "      <td>0.014286</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.076733</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6835</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.068952</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.302898</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10790</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.325581</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.058076</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.116697</td>\n",
       "      <td>0.094101</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>56394</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.026316</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.300995</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37348</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.084084</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 186 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       feat_1  feat_2    feat_3    feat_4  feat_5  feat_6  feat_7    feat_8  \\\n",
       "39091     0.0     0.0  0.015625  0.014286     0.0     0.0     0.0  0.000000   \n",
       "6835      0.0     0.0  0.000000  0.000000     0.0     0.0     0.0  0.000000   \n",
       "10790     0.0     0.0  0.000000  0.000000     0.0     0.0     0.0  0.000000   \n",
       "56394     0.0     0.0  0.000000  0.000000     0.0     0.0     0.0  0.026316   \n",
       "37348     0.0     0.0  0.000000  0.000000     0.0     0.0     0.0  0.000000   \n",
       "\n",
       "         feat_9  feat_10  ...  feat_84_tfidf  feat_85_tfidf  feat_86_tfidf  \\\n",
       "39091  0.000000      0.0  ...            0.0       0.000000       0.000000   \n",
       "6835   0.000000      0.0  ...            0.0       0.000000       0.068952   \n",
       "10790  0.325581      0.0  ...            0.0       0.058076       0.000000   \n",
       "56394  0.000000      0.0  ...            0.0       0.000000       0.000000   \n",
       "37348  0.000000      0.0  ...            0.0       0.000000       0.000000   \n",
       "\n",
       "       feat_87_tfidf  feat_88_tfidf  feat_89_tfidf  feat_90_tfidf  \\\n",
       "39091       0.000000       0.000000       0.000000            0.0   \n",
       "6835        0.000000       0.302898       0.000000            0.0   \n",
       "10790       0.116697       0.094101       0.000000            0.0   \n",
       "56394       0.000000       0.000000       0.300995            0.0   \n",
       "37348       0.000000       0.000000       0.000000            0.0   \n",
       "\n",
       "       feat_91_tfidf  feat_92_tfidf  feat_93_tfidf  \n",
       "39091            0.0       0.076733            0.0  \n",
       "6835             0.0       0.000000            0.0  \n",
       "10790            0.0       0.000000            0.0  \n",
       "56394            0.0       0.000000            0.0  \n",
       "37348            0.0       0.084084            0.0  \n",
       "\n",
       "[5 rows x 186 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from scipy.sparse import csr_matrix\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "y = train['target']\n",
    "X = train.drop([\"id\", \"target\"], axis=1)\n",
    "\n",
    "# 保存特征名字\n",
    "feat_names = X.columns \n",
    "\n",
    "# 从数据集中随机分割出10,000的样本作为训练集\n",
    "X_train, X_drop, y_train, y_drop = train_test_split(X, y, train_size=10000, random_state=10)\n",
    "X_train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 186)\n"
     ]
    }
   ],
   "source": [
    "print (X_train.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**把训练集变为稀疏矩阵，加快模型训练速度。**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train = csr_matrix(X_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2、构建模型\n",
    "\n",
    "### 2.1、LinearSVM \n",
    "\n",
    "用数据训练线性SVM模型，并对正则惩罚项 C 进行超参数调优，并分析不同C对应的训练误差，以及交叉验证得到的测试误差的变化趋势。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/svm/base.py:931: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7685\n",
      "{'C': 10.0}\n"
     ]
    }
   ],
   "source": [
    "# 线性SVM\n",
    "from sklearn.svm import LinearSVC\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "Cs = np.logspace(-3, 3, 7)\n",
    "param_grid = {'C': Cs}\n",
    "\n",
    "svc_lr = LinearSVC(penalty='l2', loss='squared_hinge', max_iter=10000)\n",
    "grid = GridSearchCV( svc_lr, param_grid, cv=5)\n",
    "\n",
    "grid.fit(X_train, y_train)\n",
    "\n",
    "print(grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([ 0.24015603,  0.21543798,  0.17677779,  0.46293077,  2.85080428,\n",
       "        28.01401815, 34.92569504]),\n",
       " 'std_fit_time': array([0.02252106, 0.02950011, 0.01258155, 0.03022791, 0.05375569,\n",
       "        1.10289144, 1.93436068]),\n",
       " 'mean_score_time': array([0.00407782, 0.0035708 , 0.00382137, 0.00365143, 0.00346274,\n",
       "        0.0035481 , 0.00396171]),\n",
       " 'std_score_time': array([6.96050187e-04, 5.03110567e-04, 7.90253132e-04, 2.97748874e-04,\n",
       "        8.39094400e-05, 2.27261930e-04, 5.32234469e-04]),\n",
       " 'param_C': masked_array(data=[0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0],\n",
       "              mask=[False, False, False, False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'C': 0.001},\n",
       "  {'C': 0.01},\n",
       "  {'C': 0.1},\n",
       "  {'C': 1.0},\n",
       "  {'C': 10.0},\n",
       "  {'C': 100.0},\n",
       "  {'C': 1000.0}],\n",
       " 'split0_test_score': array([0.70723192, 0.75012469, 0.77356608, 0.77755611, 0.78154613,\n",
       "        0.78004988, 0.77306733]),\n",
       " 'split1_test_score': array([0.69111776, 0.73652695, 0.75698603, 0.76546906, 0.77245509,\n",
       "        0.76896208, 0.76347305]),\n",
       " 'split2_test_score': array([0.68934467, 0.73686843, 0.75487744, 0.76388194, 0.76688344,\n",
       "        0.76238119, 0.75737869]),\n",
       " 'split3_test_score': array([0.68837675, 0.72695391, 0.73547094, 0.751002  , 0.751002  ,\n",
       "        0.75501002, 0.74749499]),\n",
       " 'split4_test_score': array([0.70691383, 0.74148297, 0.75651303, 0.76603206, 0.77054108,\n",
       "        0.76953908, 0.76553106]),\n",
       " 'mean_test_score': array([0.6966, 0.7384, 0.7555, 0.7648, 0.7685, 0.7672, 0.7614]),\n",
       " 'std_test_score': array([0.00859881, 0.00753536, 0.01209284, 0.00843724, 0.00998637,\n",
       "        0.00831398, 0.00856656]),\n",
       " 'rank_test_score': array([7, 6, 5, 3, 1, 2, 4], dtype=int32),\n",
       " 'split0_train_score': array([0.6956848 , 0.74058787, 0.76385241, 0.78273921, 0.79324578,\n",
       "        0.80037523, 0.79874922]),\n",
       " 'split1_train_score': array([0.69972486, 0.74362181, 0.76563282, 0.78576788, 0.79689845,\n",
       "        0.80365183, 0.80327664]),\n",
       " 'split2_train_score': array([0.69766279, 0.74465692, 0.76815398, 0.78827647, 0.79865017,\n",
       "        0.80577428, 0.80302462]),\n",
       " 'split3_train_score': array([0.7003998 , 0.74225387, 0.76811594, 0.78885557, 0.80009995,\n",
       "        0.80634683, 0.80322339]),\n",
       " 'split4_train_score': array([0.69465267, 0.7430035 , 0.76574213, 0.7836082 , 0.79485257,\n",
       "        0.80234883, 0.79810095]),\n",
       " 'mean_train_score': array([0.69762499, 0.74282479, 0.76629946, 0.78584947, 0.79674938,\n",
       "        0.8036994 , 0.80127496]),\n",
       " 'std_train_score': array([0.00222304, 0.00136775, 0.00164207, 0.00243436, 0.0024793 ,\n",
       "        0.00219956, 0.00233744])}"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grid.cv_results_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**不同正则参数C下，对应的正确率曲线**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot误差曲线\n",
    "train_means = grid.cv_results_['mean_train_score']\n",
    "test_means = grid.cv_results_['mean_test_score']\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "\n",
    "plt.plot(x_axis, np.array(train_means), 'r-', label='Train')    \n",
    "plt.plot(x_axis, np.array(test_means), 'b--', label='Test')    \n",
    "\n",
    "plt.legend()\n",
    "plt.xlabel( 'log(C)' )                                                                                                      \n",
    "plt.ylabel( 'accuracy' )\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**由上图可以看出，当log(C) = 1.0，即C = 10 时，L2正则的正确率最大。**  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.2、rbf-SVM \n",
    "\n",
    "    1、正则参数C：  \n",
    "\n",
    "        由于会被所有SVM核用到，在样本误分类和决策平面的复杂性之间做出权衡。  \n",
    "        其中，当 C 越小，意味着训练误差可以容忍大一些，那么决策边界平滑；  \n",
    "        而当 C 越大，意味着要求更多的样本被分类正确，决策边界越不平滑，模型越复杂。  \n",
    "\n",
    "    2、核函数宽度gamma：\n",
    "        \n",
    "        gamma定义了单个训练样本能影响的范围。  \n",
    "        其中，当 gamma 越小，也就是 sigma 越大，样本影响范围越大，决策边界越平滑，可能会有欠拟合现象；  \n",
    "        而当 gamma 越大，也就是 sigma 越小，高斯核函数越陡峭，样本影响范围小，决策边界不平滑，可能会过拟合。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/svm/base.py:244: ConvergenceWarning: Solver terminated early (max_iter=5000).  Consider pre-processing your data with StandardScaler or MinMaxScaler.\n",
      "  % self.max_iter, ConvergenceWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise-deprecating',\n",
       "       estimator=SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,\n",
       "  decision_function_shape='ovr', degree=3, gamma='auto_deprecated',\n",
       "  kernel='rbf', max_iter=5000, probability=False, random_state=None,\n",
       "  shrinking=True, tol=0.001, verbose=False),\n",
       "       fit_params=None, iid='warn', n_jobs=None,\n",
       "       param_grid={'C': [0.01, 0.1, 1, 10, 100], 'gamma': [0.0001, 0.001, 0.01, 0.1, 1]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring=None, verbose=0)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.svm import SVC\n",
    "\n",
    "Cs = [ 0.01, 0.1, 1, 10, 100]\n",
    "gammas = [0.0001, 0.001, 0.01, 0.1, 1]\n",
    "\n",
    "param_grid = {'C': Cs, 'gamma': gammas}\n",
    "svc_rbf =  SVC( kernel='rbf', max_iter=5000)\n",
    "grid = GridSearchCV( svc_rbf, param_grid, cv=5)\n",
    "\n",
    "grid.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7883\n",
      "{'C': 10, 'gamma': 1}\n"
     ]
    }
   ],
   "source": [
    "print(grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**在不同正则参数C和核函数宽度gamma下，对应的正确率曲线**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot误差曲线\n",
    "test_means = grid.cv_results_['mean_test_score']\n",
    "test_stds = grid.cv_results_['std_test_score']\n",
    "\n",
    "# plot results\n",
    "n_Cs = len(Cs)\n",
    "number_gamms = len(gammas)\n",
    "\n",
    "test_scores = np.array(test_means).reshape(n_Cs, number_gamms)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs, number_gamms)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(gammas):\n",
    "    plt.plot(x_axis, test_scores[:, i], label=gammas[i])\n",
    "\n",
    "\n",
    "plt.legend()\n",
    "plt.xlabel( 'log(C)' )                                                                                                      \n",
    "plt.ylabel( 'accuracy' )\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 当 gamma 值逐渐增大时，准确率提高迅速，说明核函数宽度的取值相当重要。  \n",
    "- 当 C 值逐渐增大时，准确率也有一定幅度的上升，但正则参数并不是越大越好，比如在C=100时，各曲线的准确率均有些许下降。  \n",
    "- 不过总的来说，gamma和C对正确率的作用成正比，其最优参数 {'C': 10, 'gamma': 1} ，在此最优超参数取值下，准确率为0.7883。  "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
